#include <memory>
#include <vector>
#include <algorithm>

using namespace std;

class Foo {
    public:
        Foo& operator=(const Foo&) &; // 引用限定符：只能向可修改的左值赋值
        // 一个函数可以同时用 const 和引用限定符
        // Foo someMem() & const {}      // 错误：const 限定符必须在前
        Foo anotherMem() const & {}   // 正确：const 限定符在前
        // Foo 的其他参数
};

Foo &Foo::operator=(const Foo &rhs) &
{
    /* 执行将 rhs 赋予本对象所需的工作 */
    return *this;
}

int main()
{
    Foo &retFoo();          // 返回一个引用
    Foo retVal();           // 返回一个值
    Foo i, j;               // i 和 j 是左值
    i = j;                  // 正确：i 是左值
    retFoo() = j;           // 正确：retFoo() 返回一个左值
    // retVal() = j;           // 错误：retVal() 返回一个右值
    i = retVal();           // 正确：我们可以将一个右值作为赋值操作的右侧运算对象
}